package dbx

import (
	"sync"

	"gorm.io/gorm"
)

// Tx 事务对象
type Tx struct {
	once   sync.Once
	commit bool
	Tx     *gorm.DB
}

// NewTx 创建事务
// conn := dbx.NewTx(db_toprare_kernel.Client())
// defer conn.End()
func NewTx(db *gorm.DB) *Tx {
	return &Tx{Tx: db.Begin()}
}

// End 结束事务
// 应在启动后立即defer调用
func (t *Tx) End() {
	t.once.Do(func() {
		if t.commit {
			t.Tx.Commit()
		} else {
			t.Tx.Rollback()
		}
	})
}

// Commit 事务失败，当想回滚时调用
func (t *Tx) Commit() {
	t.commit = true
}
